# 据说这是一道动态规划题
# 子问题定义，dp[i]为前i个字符所能构成的松散子序列的最大价值
# 也就是说，主要讨论的是在第i个元素一定取的情况下，前dp[0:i-1] => [0->i-2](切片的语法)个元素怎么取，
# 右开区间的原因是有[松散: P(i) - P(i-1) >= 2]子序列的要求
# 所以:
# i=0 dp[0] = value(s[0])
# i=1 dp[1] = value(s[1])
# i=2 dp[2] = value(s[2]) + value(s[0])  由于松散序列的距离要求
# i=3 dp[3] = value(s[3]) + max(dp[i-2], dp[i-3])

# 先把字符串序列用lambda表达式给转变成对应的价值数组，这样后面就都不用计算了，效率会更高！
value = list(map(lambda s: ord(s) - 96, input()))  # 从0开始计数

# dp[i] 表示第 i 个字符被采用时的最高分数
dp = [0] * (len(value) + 1)  # 从1开始计数
dp[1:3] = value[:2]  # dp数组初始化
# -> dp[1] = value[0]
# -> dp[2] = vlaue[1]  # 它这里似乎没处理字符串长度为1的特殊情况，但是依然过了，不懂为啥？？

# 找到最优的前置状态: 最优松散子序列中各个数的间隔不超过 2
for i in range(3, len(value) + 1):
    dp[i] = max(dp[i - 3: i - 1]) + value[i - 1]
# 最后两个数必有一个被包含
print(max(dp[-2:]))